// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.ast.SQLHint;
// import com.alibaba.druid.sql.ast.statement.SQLErrorLoggingClause;
// import com.alibaba.druid.sql.ast.statement.SQLInsertInto;
// import com.alibaba.druid.sql.ast.statement.SQLSelect;
// import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject;
// import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl;
// import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
// import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

// import java.util.ArrayList;
// import java.util.List;
#pragma once
#include "OracleStatementImpl.h"
#include "../OracleSQLObject.h"
#include "../OracleSQLObjectImpl.h"
#include "../../../../ast/statement/SQLInsertInto.h"

class OracleMultiInsertStatement_Option
{
public:
  static OracleMultiInsertStatement_Option_ptr ALL;
  static OracleMultiInsertStatement_Option_ptr FIRST;
  string_ptr name;
  uint64_t mask;

  OracleMultiInsertStatement_Option(uint64_t mask, string_ptr name);
};

class OracleMultiInsertStatement_Entry
    : virtual public OracleSQLObject
{
};

class OracleMultiInsertStatement_ConditionalInsertClause
    : virtual public OracleSQLObjectImpl,
      virtual public OracleMultiInsertStatement_Entry
{
public:
  OracleMultiInsertStatement_ConditionalInsertClauseItem_list_ptr items;
  OracleMultiInsertStatement_InsertIntoClause_ptr elseItem;

  OracleMultiInsertStatement_ConditionalInsertClause();
  SHAREDOBJECT(OracleMultiInsertStatement_ConditionalInsertClause);

  OracleMultiInsertStatement_InsertIntoClause_ptr getElseItem();

  void setElseItem(OracleMultiInsertStatement_InsertIntoClause_ptr elseItem);

  OracleMultiInsertStatement_ConditionalInsertClauseItem_list_ptr getItems();

  void addItem(OracleMultiInsertStatement_ConditionalInsertClauseItem_ptr item);

  // @Override
  void accept0(OracleASTVisitor_ptr visitor);
};

class OracleMultiInsertStatement_ConditionalInsertClauseItem
    : virtual public OracleSQLObjectImpl
{
public:
  SQLExpr_ptr when;
  OracleMultiInsertStatement_InsertIntoClause_ptr then;

  SHAREDOBJECT(OracleMultiInsertStatement_ConditionalInsertClauseItem);
  SQLExpr_ptr getWhen();

  void setWhen(SQLExpr_ptr when);

  OracleMultiInsertStatement_InsertIntoClause_ptr getThen();

  void setThen(OracleMultiInsertStatement_InsertIntoClause_ptr then);

  // @Override
  void accept0(OracleASTVisitor_ptr visitor);
};

class OracleMultiInsertStatement_InsertIntoClause
    : virtual public SQLInsertInto,
      virtual public OracleSQLObject,
      virtual public OracleMultiInsertStatement_Entry
{
public:
  OracleReturningClause_ptr returning;
  SQLErrorLoggingClause_ptr errorLogging;

  OracleMultiInsertStatement_InsertIntoClause();
  SHAREDOBJECT(OracleMultiInsertStatement_InsertIntoClause);

  OracleReturningClause_ptr getReturning();

  void setReturning(OracleReturningClause_ptr returning);

  SQLErrorLoggingClause_ptr getErrorLogging();

  void setErrorLogging(SQLErrorLoggingClause_ptr errorLogging);

  // @Override
  void accept0(SQLASTVisitor_ptr visitor);

  // @Override
  void accept0(OracleASTVisitor_ptr visitor);

  void cloneTo(OracleMultiInsertStatement_InsertIntoClause_ptr x);

  SQLObject_ptr clone();
};

class OracleMultiInsertStatement
    : virtual public OracleStatementImpl
{
public:
  SQLSelect_ptr subQuery;
  OracleMultiInsertStatement_Option_ptr option;
  OracleMultiInsertStatement_Entry_list_ptr entries;
  SQLHint_list_ptr hints;

  OracleMultiInsertStatement();
  SHAREDOBJECT(OracleMultiInsertStatement);

  SQLHint_list_ptr getHints();

  void setHints(SQLHint_list_ptr hints);

  OracleMultiInsertStatement_Entry_list_ptr getEntries();

  void addEntry(OracleMultiInsertStatement_Entry_ptr entry);

  OracleMultiInsertStatement_Option_ptr getOption();

  void setOption(OracleMultiInsertStatement_Option_ptr option);

  SQLSelect_ptr getSubQuery();

  void setSubQuery(SQLSelect_ptr subQuery);

  // @Override
  void accept0(OracleASTVisitor_ptr visitor);
};
